4. 高阶函数 Higher-order Functions
高阶函数(Higher-order Functions) 是一种接受一个函数作为参数或以函数作为返回值的函数。
高阶函数可以用于:
- 表达更加泛化的计算方法
- 减少重复的代码
- 编写函数时可以考虑更加一般化的东西
高阶函数示例
def calculate_sum(N, term):
"""
Calculate and returns the sum value of the first N elements of an array
where the gerneral formula is given by function 'term'
"""
sum, i = 0, 1
while i < N:
sum, i = sum + term(i), i+1
return sum
# 下面是例子
def identity(x):
return x
def square(x):
return x*x
def inverse(x):
return 1/x
print(calculate_sum(10, square)) # 285
print(calculate_sum(10, identity)) # 45
print(calculate_sum(10, inverse)) # 2.8289682539682537
def make_adder(k):
def adder(n):
return n + k
return adder
# 下面是例子
print(make_adder(2)(3)) # 5
f = make_adder(1000)
print(f(10)) # 1010
接下来的内容十分重要,请务必反复温习确保精通相关的知识。
高阶函数可以正确查询到需要的值的原理如下:
- 每个用户定义的函数有一个父帧,其为函数在被定义时所处的帧。
- 每一个函数内的局部帧有一个父帧,该父帧即为被调用函数的父帧。
示例
def compose(f,g):
def h(x):
return f(g(x));
return h
该函数可以接受两个函数并输出其复合函数。当执行该函数时,其环境图如下所示:/Pasted%20image%2020250228200127.png)
对于一些没有副作用,只是接受一个参数并返回进行某些计算结果的较为短小的函数,可以考虑使用 匿名函数(Lambda Function) 来定义。其形式为:
lambda <形参表>: 返回值表达式
lambda 表达式的函数体 只能有一条语句,即返回值表达式。显然 lambda 表达式一定是一个纯函数。因为此限制,其在 python 中并不常见。
函数的 柯里化(Currying) 是指将一个多参数函数转换为单参数的高阶函数的过程,该高阶函数返回一个接受剩余参数的函数。其又称 部分求值,这表明一个柯里化的函数并不会立即求值,而是继续返回另外一个函数,先前传入的值在该函数所处的环境中被储存起来,等待函数需要真正被求值时,将先前传入的所有参数都一次性用于求值。
以上面的 make_adder 函数举例,显然它是 add 函数柯里化后的结果。
对于一个双参数函数,我们可以定义对该函数进行柯里化的函数:
def curry_2args(f):
def g(x):
def h(y):
return f(x,y)
return h
return g
解释:该函数接受一个双参数函数,并返回一个单参数函数。返回的这个单参数函数同样返回一个单参数函数,该函数返回的结果等于 f(x,y) 。
用 lambda 表达式来写,它长这样:
curry_2args = lambda f: lambda x: lambda y: f(x,y)